<?php
/**
 * @date   2015-08-02
 * Uesd: 主要功能是 前端资源加载
 */

namespace ulue\parts\asset;

use Ulue;
use ulue\libs\front\Html;

abstract class AssetLoad
{
    static public $baseUrl  = '/';
    static public $basePath = '';

    /**
     * 网站域名url地址
     * @example http:://www.xxx.com
     * @var string
     */
    static public $hostUrl = '';

    /**
     *
     * @param $asset 要加载的资源
     * 1. $asset = 'filepath' 加载一个文件
     * 2. $asset = 'a,b,c' 加载 a,b,c 多个文件
     * 3. 直接使用数组配置
     *    $asset = [
     *        'file1',
     *        'file2',
     *        'file3',
     *        'file4',
     *         ...
     *   ]
     *
     * @param array $options 默认加载 css
     *   $options = [
     *       'useFullUrl' => 输出的 asset url 是否使用带域名的完整url； true 是  | false 否
     *       'resType'    => 资源文件类型 css js,
     *       'baseUrl'    => base url 资源文件 基准url
     *       'basePath'   => baseUrl 对应的 真实目录,
     *   ]
     **/
    static protected function _handleLoad($asset, array $options=[])
    {
        $options = array_merge( [
                    'useFullUrl' => false,   // url path 是: true 绝对  | false 相对
                    'resType'    => AssetManager::ASSET_CSS,   // 资源文件类型 css js
                    'baseUrl'    => static::$baseUrl,     // 资源文件 基准url
                    'basePath'   => static::$basePath,    // 资源文件 基准url 对应的 真实目录
                ], $options );

        $useFullUrl = (bool)$options['useFullUrl'];
        $resType    = $options['resType'];
        $baseUrl    = $options['baseUrl'];
        $basePath   = $options['basePath'];

        if (is_array($asset)) {
            foreach ($asset as $file) {
                $url = self::buildUrl($file, $useFullUrl, $baseUrl, $basePath);

                echo  $resType == AssetManager::ASSET_CSS ? Html::link($url) : Html::script($url);
            }

        } elseif ( $asset && is_scalar($asset) ) {

            //是否是以逗号连接的多个文件名
            if (strpos($asset, ',') && !strstr($asset, 'http')) {
                $files    = explode(',', $asset);

                foreach ($files as $file) {
                    $url = self::buildUrl($file, $useFullUrl, $baseUrl, $basePath);

                    echo  $resType == AssetManager::ASSET_CSS ? Html::link($url) : Html::script($url);
                }

            } else {
                $url = self::buildUrl( $asset, $useFullUrl, $baseUrl, $basePath);

                echo  $resType == AssetManager::ASSET_CSS ? Html::link($url) : Html::script($url);
            }
        }

        unset($asset, $options, $basePath, $baseUrl, $url);
    }

    /**
     * 加载 css 文件
     * @param  string $asset
     * @param  array $options
     * @return void
     */
    static public function css($asset, array $options=[])
    {
        self::_handleLoad($asset, $options);
    }

    static public function loadCss($asset, array $options=[])
    {
        self::css($asset, $options);
    }

    /*
     * 加载 js文件
     */
    static public function js($asset, array $options=[])
    {
        if (!isset($options['resType'])) {
            $options['resType'] = AssetManager::ASSET_JS;
        }

        self::_handleLoad($asset, $options);
    }

    static public function loadJs($asset, array $options=[])
    {
        self::js($asset, $options);
    }

    /**
     * @param  string $path
     * @return string
     */
    static public function getPath($path)
    {
        $path = trim($path);

        if ($path && !is_int($path)) {
            return rtrim($path, '/\\') . '/';
        }

        return '';
    }

    //资源路径检查，返回可用的 url path,末尾都已经添上了 '/'
    // $useFullUrl 返回 url path 是: true 绝对  | false 相对
    static public function buildUrl( $path, $useFullUrl=false, $baseUrl = '/', $basePath = '')
    {
        $path = str_replace( '\\','/',trim($path,'/\\ ') );

        if ( substr($path,0,1)==='@' ) {
            $path = Ulue::resolveAlias($path);
        }

        $hostUrl   = self::getHostAddr();

        //是完整的url路径
        if ( self::isUrl($path,'url') ) {

            return $path;

        //是url绝对路径
        } else if ( $path{0} == '/' ) {

            return $useFullUrl ? $hostUrl . $path :  $path;
        }

        // 相对路径
        $baseUrl = $baseUrl ? rtrim($baseUrl, '/') . '/' : '/';

        if ( $basePath ) {
            $basePath = rtrim($basePath, '/') . '/';

            if (!file_exists($basePath . $path)) {
                Trigger::error('资源 ['. $basePath . $path .'] 不存在 !!','load');
            }

        }

        return ($useFullUrl ? $hostUrl . '/' : $baseUrl) . $path;
    }

    static public function getHostAddr()
    {
        if (!self::$hostUrl) {
            self::$hostUrl = $_SERVER['REQUEST_SCHEME'] . '/'.'/'.$_SERVER['HTTP_HOST'];
        }

        return self::$hostUrl;
    }


    static public function isUrl($str)
    {
        $rule = '/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i';

        return preg_match($rule, trim($str) )===1;
    }
}